﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajoEstibador');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncOrdTrabajoEstibador"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codEstibador" CHARACTER VARYING(16)
	,INOUT	"@observaciones" CHARACTER VARYING(256)
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
BEGIN

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codEstibador","observaciones"
		FROM	"OrdTrabajoEstibador"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID OT*/
	IF "@OP"='selectByIdOrdTrabajo' THEN
		-- obtengo el codigo de la Orden de trabajo
		Auxiliar=(select "codOrdTrabajo" from "OrdTrabajo" where id="@id");
		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codEstibador","observaciones"
		FROM	"OrdTrabajoEstibador"
		WHERE	"codOrdTrabajo"=Auxiliar;
	RETURN;
	END IF;

	/*SELECT BY CODIGO*/
/*
	IF "@OP"='selectByOrdTrabajo' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codEstibador","observaciones"
		FROM	"OrdTrabajoEstibador"
		WHERE	"codOrdTrabajo"="@codOrdTrabajo";
	RETURN;
	END IF;
*/
	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codEstibador","observaciones"
		FROM	"OrdTrabajoEstibador";
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- Verifico que no exista esa relacion
		IF EXISTS (SELECT 1 FROM "OrdTrabajoEstibador" WHERE "codOrdTrabajo"="@codOrdTrabajo" AND "codEstibador"="@codEstibador") THEN
			Auxiliar = 'El estibador con codigo "' || "@codEstibador" || '" ya se encuentra asociado a la Orden de trabajo "' || "@codOrdTrabajo" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista el Estibador
		IF NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codEstibador") THEN
			Auxiliar = 'El estibador indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que el estibador este activo
		IF NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codEstibador" and activo=true) THEN
			Auxiliar = 'El estibador indicado NO SE ENCUENTRA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico el numero maximo de estibadores permitidos
		IF (SELECT COUNT(*) FROM "OrdTrabajoEstibador" WHERE "codOrdTrabajo"="@codOrdTrabajo")>=CAST(coalesce((select valor FROM "SeguridadParametro" where "codParametro"='NumMaxEstibPorOT'),'0') AS INTEGER) THEN
			Auxiliar = 'No puede asociar mas Estibadores a esta OT, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		-- Grabo el registro
		INSERT INTO "OrdTrabajoEstibador" ("usuarioGrab","usuarioUltMod","activo","codOrdTrabajo","codEstibador","observaciones")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE),"@codOrdTrabajo","@codEstibador","@observaciones");

		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codEstibador","observaciones"
		FROM	"OrdTrabajoEstibador"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
/*
	IF "@OP"='update' THEN
		--- Verifico que no exista  con ese CODIGO
		IF EXISTS (SELECT 1 FROM "OrdTrabajoEstibador" WHERE "codOrdTrabajo"="@codOrdTrabajo" AND "codEstibador"="@codEstibador") THEN
			Auxiliar = 'Ya existe un estibador con codigo "' || "@codEstibador" || '" ya se encuentra asociado a la Orden de trabajo "' || "@codOrdTrabajo" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista el Estibador
		IF NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codEstibador") THEN
			Auxiliar = 'El estibador indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que el estibador este activo
		IF NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codEstibador" and activo=true) THEN
			Auxiliar = 'El estibador indicado NO SE ENCUENTRA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajoEstibador" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codEstibador"="@codEstibador"			
			,"observaciones"="@observaciones"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;
*/
	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "OrdTrabajoEstibador" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

